package ukoly;

import database.DatabazovaChyba;
import java.util.Date;
import java.util.GregorianCalendar;
import uzivatele.Uzivatel;
import database.DbService;
import javax.swing.JOptionPane;
import system.Launcher;

/**
 * Kdo si jako promennou pro obecny zachazeni s ukoly da bez dobryho duvodu ProjektModel
 * misto ProjektControl, bude zabit. Brutalne.
 * 
 * @author Pavel Lieberzeit
 */
public class ProjektControl {
    
    private ProjektModel projekt;
    
    
    /**
     * Vytvori ProjektControl, pro inicializaci z dutobaze
     * @param ID
     * @param jmeno
     * @param popis
     * @param casStart
     * @param casKonec
     * @param deadline
     * @param casStraven
     * @param odpovedny
     * @param status 
     */
    public ProjektControl(int ID, String jmeno, String popis, GregorianCalendar casStart, GregorianCalendar casKonec, 
            GregorianCalendar deadline, int casStraven, Uzivatel odpovedny, UkolStatus status) {
        
        this.projekt = new ProjektModel(ID, jmeno, popis, casStart, casKonec, deadline, 
                casStraven, odpovedny, status);
    }
    
//    public ProjektControl() {
//    }
    
    private ProjektControl(ProjektModel model) {
        this.projekt = model;
    }
    
    public void editProjekt(String jmeno, String popis, GregorianCalendar deadline,
            Uzivatel odpovedny, UkolStatus status, int casStraven) throws DatabazovaChyba {
        
        this.projekt.setJmeno(jmeno);
        this.projekt.setPopis(popis);
        this.projekt.setCasDead(deadline);
        this.projekt.setOdpovedny(odpovedny);
        
        if(this.projekt.getStatus() != UkolStatus.COMPLETE && status == UkolStatus.COMPLETE) {
            this.projekt.setCasKonec(new GregorianCalendar());
            this.projekt.getCasDead().setTime(new Date(System.currentTimeMillis()));
        } else if (this.projekt.getStatus() == UkolStatus.COMPLETE && status != UkolStatus.COMPLETE) {        
            this.projekt.setCasKonec(null);
        }        
        this.projekt.setStatus(status);
        
        this.projekt.setCasStraven(casStraven);
        
        Launcher.getInstance().getDatabase().ulozProjekt(this);
        
    }
    
    public void deleteProjekt() throws DatabazovaChyba {

        Launcher.getInstance().getDatabase().smazProjekt(this);
        
//        this.projekt = null;        
    }
    
    
    /**
     * Pouzije se u vytvareni noveho projektu. GUI rozpozna, jestli se projekt vytvari nebo edituje a podle toho zavola
     * budto tuto metodu, nebo edit. Hodnoty musi byt preprocessovany.
     * @param ID
     * @param jmeno
     * @param popis
     * @param deadline
     * @param odpovedny
     * @param status 
     */
    public static ProjektControl createProjekt(int ID, String jmeno, String popis, GregorianCalendar deadline,
            Uzivatel odpovedny, UkolStatus status, int casStraven) throws DatabazovaChyba {
        
//        this.projekt = new ProjektModel(ID, jmeno, popis, deadline, odpovedny, status);
        ProjektModel projekt = new ProjektModel(ID, jmeno, popis, deadline, odpovedny, status, casStraven);
        
        if(status == UkolStatus.COMPLETE || status == UkolStatus.CONFIRMED){
            projekt.setCasKonec(new GregorianCalendar());
            projekt.getCasKonec().setTime(new Date(System.currentTimeMillis()));
        }
        
        
        return Launcher.getInstance().getDatabase().vytvorProjekt(new ProjektControl(projekt));
    }
    
    public ProjektModel getModel() {
        return this.projekt;
    }

    @Override
    public int hashCode() {
        int hash = 7;
        hash = 19 * hash + (this.projekt != null ? this.projekt.hashCode() : 0);
        return hash;
    }

    /**
     * Technicka poznamka - v praktickem vyuziti by se equals nemelo skoro pouzit, protoze
     * jediny rozpoznavaci atribut je ID. Udaje se uvnitr programu neukladaji a posilaji/nacitaji se do databaze
     */
     @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final ProjektControl other = (ProjektControl) obj;
        if (this.projekt != other.projekt && (this.projekt == null || !this.projekt.equals(other.projekt))) {
            return false;
        }
        return true;
    }
    
}
